Vue Provide/Inject
Vue-তে প্রদান/ইনজেক্ট ব্যবহার করা হয় একটি উপাদান থেকে অন্যান্য উপাদানগুলিতে, বিশেষত বড় প্রকল্পগুলিতে ডেটা সরবরাহ করতে।
অন্যান্য উপাদানের জন্য উপলভ্য তথ্য প্রদান করে.
সরবরাহকৃত ডেটা পেতে ইনজেকশন ব্যবহার করা হয়।
প্রপস ব্যবহার করে ডেটা পাঠানোর বিকল্প হিসাবে ডেটা ভাগ করে নেওয়ার একটি উপায় প্রদান/ইনজেক্ট।
Provider
ডেটা প্রদান করে
Injector
ডেটা পায়
ধারণা প্রদান/ইনজেক্ট করুন
একটি বড় প্রকল্পে, উপাদানগুলির মধ্যে উপাদানগুলির সাথে, "App.vue" থেকে একটি সাব-কম্পোনেন্টে ডেটা পাস করার জন্য প্রপস ব্যবহার করা কঠিন হতে পারে কারণ প্রতিটি উপাদানে প্রপগুলিকে সংজ্ঞায়িত করা আবশ্যক যার মাধ্যমে ডেটা পাস করা হয়।
আমরা যদি props-এর পরিবর্তে provide/inject ব্যবহার করি, তাহলে আমাদের প্রদত্ত ডেটা শুধুমাত্র যেখানে এটি প্রদান করা হয়েছে এবং ইনজেকশন করা ডেটা শুধুমাত্র যেখানে এটি ইনজেকশন করা হয়েছে তা সংজ্ঞায়িত করতে হবে।
প্রপস (প্রথাগত পদ্ধতি)
ডেটা প্রতিটি উপাদানের মধ্য দিয়ে যেতে হবে
App → ComponentA → ComponentB → ComponentC
প্রপস অবশ্যই সমস্ত মধ্যবর্তী উপাদানগুলিতে সংজ্ঞায়িত করা উচিত
প্রদান/ইনজেকশন (সরাসরি পদ্ধতি)
ডেটা সরাসরি উপাদানগুলিতে যায়
App (provide) → ComponentC (inject)
মধ্যবর্তী উপাদানগুলির ডেটা পাস করার প্রয়োজন নেই
ডেটা প্রদান করুন
অন্যান্য উপাদানগুলিতে ডেটা উপলব্ধ করতে আমরা 'প্রদান' কনফিগারেশন বিকল্পটি ব্যবহার করি:
<template>
<h1>Food</h1>
<div @click="this.activeComp = 'food-about'" class="divBtn">About</div>
<div @click="this.activeComp = 'food-kinds'" class="divBtn">Kinds</div>
<div id="divComp">
<component :is="activeComp"></component>
</div>
</template>
<script>
export default {
data() {
return {
activeComp: 'food-about',
foods: [
{ name: 'Pizza', imgUrl: '/img_pizza.svg' },
{ name: 'Apple', imgUrl: '/img_apple.svg' },
{ name: 'Cake', imgUrl: '/img_cake.svg' },
{ name: 'Fish', imgUrl: '/img_fish.svg' },
{ name: 'Rice', imgUrl: '/img_rice.svg' }
]
}
},
provide() {
return {
foods: this.foods
}
}
}
</script>
উপরের কোডে, 'খাবার' অ্যারেটি এখন সরবরাহ করা হয়েছে যাতে এটি আপনার প্রকল্পের অন্যান্য উপাদানগুলিতে ইনজেক্ট করার জন্য উপলব্ধ।
প্রদান() ফাংশন:
provide() একটি ফাংশন হওয়া উচিত, যা একটি বস্তু প্রদান করে। এই ফাংশনের মধ্যে, আপনি 'this' ব্যবহার করে ডেটা(), কম্পিউটেড, বা পদ্ধতিগুলি থেকে বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন। প্রোভাইড() থেকে অবজেক্টের বৈশিষ্ট্যগুলি সমস্ত চাইল্ড উপাদানের (এবং তাদের বাচ্চাদের) জন্য উপলব্ধ।
ইনজেক্ট ডেটা
এখন যেহেতু 'খাবার' অ্যারে 'অ্যাপ.ভিউ'-তে 'প্রোভাইড' এর মাধ্যমে উপলব্ধ করা হয়েছে, আমরা এটিকে 'ফুডকিন্ডস' উপাদানে যুক্ত করতে পারি।
যেহেতু 'খাবার' ডেটা 'FoodKinds' উপাদানে প্রবেশ করানো হয়, তাই আমরা 'FoodKinds' উপাদানে বিভিন্ন খাবার প্রদর্শন করতে App.vue থেকে ডেটা ব্যবহার করতে পারি:
উদাহরণ
আপনার নিজস্ব Vue সার্ভার পান
FoodKinds.vue:
<template>
<h2>Different Kinds of Food</h2>
<p><mark>In this application, food data is provided in "App.vue", and injected in the "FoodKinds.vue" component so that it can be shown here:</mark></p>
<div v-for="x in foods">
<img :src="x.imgUrl">
<p class="pName">{{ x.name }}</p>
</div>
</template>
<script>
export default {
inject: ['foods']
}
</script>
<style scoped>
div {
margin: 10px;
padding: 10px;
display: inline-block;
width: 80px;
background-color: #28e49f47;
border-radius: 10px;
}
.pName {
text-align: center;
}
img {
width: 100%;
}
</style>
দ্রষ্টব্য: inject হল অ্যারের উপাদান সংজ্ঞাতে একটি বৈশিষ্ট্য। সরবরাহ করা ডেটা উপাদানটির একটি সম্পত্তি হিসাবে উপলব্ধ, যে নামে এটি সরবরাহ করা হয়েছিল।
Vue প্রদান/ইনজেক্ট টিউটোরিয়াল
নীচের কোডের অন্যান্য উপাদানের জন্য মাছের নাম 'Turbot' উপলভ্য করার জন্য কোন কনফিগারেশন বিকল্পের প্রয়োজন?
Vue প্রদান/ইনজেক্ট টিউটোরিয়াল
data() {
return {
fishName: 'Turbot',
count: 4
}
},
_____ {
return {
fishName: this.fishName
}
}
নীচের বিকল্পগুলি থেকে সঠিক উত্তর চয়ন করুন:
কখন প্রোভাইড/ইনজেক্ট ব্যবহার করবেন
প্রতিক্রিয়াশীল প্রদান
ডিফল্টরূপে, প্রদান/ইনজেক্ট প্রতিক্রিয়াশীল নয়। সরবরাহকৃত ডেটাতে পরিবর্তনগুলি ইনজেকশনের উপাদানগুলিতে প্রতিফলিত হয় না। প্রতিক্রিয়া পেতে, আপনাকে গণনাকৃত বৈশিষ্ট্য বা রেফ() মান প্রদান করতে হবে।
<script>
import { computed } from 'vue'
export default {
data() {
return {
user: {
name: 'John',
age: 30
}
}
},
provide() {
return {
// Computed property for reactivity
userName: computed(() => this.user.name),
userAge: computed(() => this.user.age),
// Method to update data reactively
updateUser: (newName, newAge) => {
this.user.name = newName
this.user.age = newAge
}
}
}
}
</script>
প্রতিক্রিয়া সতর্কতা:
রেন্ডার করা ডেটাকে রিঅ্যাকটিভ রাখতে, আপনাকে Vue 3-তে computed() বা ref() ব্যবহার করতে হবে। যদি আক্ষরিক মানগুলি ফেরত দেওয়া হয়, তবে তারা পরিবর্তনগুলি প্রতিফলিত করে না। উপাদানগুলির মধ্যে আপডেটযোগ্য ডেটা ভাগ করার জন্য পদ্ধতি বা ইভেন্টগুলি ব্যবহার করার কথা বিবেচনা করুন।
প্রপস প্রদান/ইনজেক্ট করুন - কখন ব্যবহার করতে হবে
| বৈশিষ্ট্য | Props | Provide/Inject |
|---|---|---|
| ডেটা প্রবাহ | মা → সরাসরি সন্তান | পূর্বপুরুষ → যেকোনো শিশু (গাছের নিচে) |
| উপাদান সমাবেশ | স্বচ্ছ এবং ট্রেস করা সহজ | অন্তর্নিহিত, কম স্পষ্ট |
| কেস ব্যবহার করুন | ক্ষুদ্র ও মাঝারি প্রকল্প | বড় প্রকল্প, প্লাগইন ফ্রেমওয়ার্ক |
| প্রতিক্রিয়াশীলতা | ডিফল্টরূপে প্রতিক্রিয়াশীল | অতিরিক্ত পদক্ষেপ প্রয়োজন (গণনা করা/রেফ) |
| ওভারভিউ | স্থানীয় দৃষ্টিকোণ (মা-শিশু) | গ্লোবাল ওভারভিউ (গাছ জুড়ে) |
সাধারণ নির্দেশনা:
বেশিরভাগ ক্ষেত্রেই প্রপস পছন্দ করা উচিত কারণ সেগুলি আরও স্বচ্ছ এবং বজায় রাখা সহজ। শুধুমাত্র গাছের গভীরে থাকা উপাদানগুলিতে ডেটা পাঠাতে বা গ্লোবাল কনফিগারেশন সেটিংস প্রয়োগ করার প্রয়োজন হলেই প্রোভাইড/ইনজেক্ট ব্যবহার করুন।
একটি বাস্তব উদাহরণ
থিম সেটিংস পরিচালনা করতে কীভাবে প্রোভাইড/ইনজেক্ট ব্যবহার করা যেতে পারে তার একটি ব্যবহারিক উদাহরণ এখানে রয়েছে:
// ThemeProvider.vue - Root component
<script>
export default {
data() {
return {
theme: 'light',
themes: {
light: { bg: '#fff', text: '#000' },
dark: { bg: '#333', text: '#fff' }
}
}
},
provide() {
return {
theme: this.theme,
currentTheme: () => this.themes[this.theme],
toggleTheme: () => {
this.theme = this.theme === 'light' ? 'dark' : 'light'
}
}
}
}
</script>
// DeeplyNestedComponent.vue - Any child component
<script>
export default {
inject: ['theme', 'currentTheme', 'toggleTheme'],
methods: {
applyTheme() {
const theme = this.currentTheme()
document.body.style.backgroundColor = theme.bg
document.body.style.color = theme.text
}
}
}
</script>
এই উদাহরণে, থিম ডেটা রুট কম্পোনেন্টে উপস্থাপিত হয় এবং থিম ম্যানেজমেন্টকে কেন্দ্রীভূত করার জন্য মধ্যবর্তী উপাদানগুলিতে প্রপস পাস না করে গাছের যে কোনও জায়গায় যে কোনও শিশু উপাদানে ইনজেকশন করা যেতে পারে।